//
//  WBNetworkManager.swift
//  新浪微博
//
//  Created by 名品导购网MPLife.com on 2017/11/24.
//  Copyright © 2017年 sweet. All rights reserved.
//

import UIKit
import AFNetworking//导入框架的文件夹的名字
/*
 如果日常开发发现返回的状态码是405
 表示不支持的网络请求方法
 首先应该查找网络请求方法是否正确
 
 */
enum WBHTTPMethod {
    case GET
    case POST
}
//网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    //静态区/常量
        //懒加载本质上是一个闭包 在第一次性访问时执行闭包 并将结果保存在share的常量中
    //单例
//    static let shared = WBNetworkManager()
    static let shared:WBNetworkManager = {
        let instance = WBNetworkManager()
        //设置反序列换
        instance .responseSerializer.acceptableContentTypes?.insert("text/plain")
        return instance
        
    }()
    //访问临牌，所有的网络请求，都基于此令牌
    //为了保护用户安全，token是有时限的 默认用户是三天
//    var accessToken :String? = "2.00siUrnB0psN9m95feb26ff1iR5zWD"
////    var accessToken :String?
//    //用户的微博Id
//    var uid:String? = "1652922782"
    //用户账户的懒加载属性
    lazy var userAccount = WBUserAccount()
    
    var userLogon:Bool{
        return userAccount.access_token != nil
    }
    /// 专门负责拼接token的网络请求方法
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: urlstring
    ///   - parameters: 参数字典
    ///   - name: 上传文件的字段名 默认为nil 就是不上传文件
    ///   - data: 上传文件的二进制数据 默认为nil 就是不上传文件
    ///   - completion: 完成回调
    func tokenRequest(method:WBHTTPMethod = .GET, URLString:String,parameters:[String:AnyObject]?,name:String?=nil,data:Data?=nil,completion:@escaping (_ json:AnyObject?,_ isSuccess:Bool)->()) {
        //处理token字典
        //判读token是否为nil 为nil直接返回 程序执行过程中，一般token不会为nil
        //判断参数字典是否存在 如果为nil 应该新建一个字典
        guard let token = userAccount.access_token else {
            print("没有token需要登录")
            //发送通知提示用户登录
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
            completion(nil, false)
            return
        }
        
        
        var parameters = parameters
        if parameters == nil {
            parameters = [String:AnyObject]()
        }
        //字典此处可选，要强行解包
        parameters!["access_token"] = token as AnyObject
        if let name = name,let data = data{
            //上传图片的方法
            upload(URLString: URLString, parameters: parameters, name: name, data: data, completion: completion)
        }else{
            //普通的 正常的网络请求
            request(method: method, URLString: URLString, parameters: parameters, completion: completion)
        }
        
     //调用Request发送真正的网络请求
    }
    
    /// 封装AFN的上传文件
    //上传文件必须是POSTget只能获取数据 不能获取数据
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    //    -name： 接受上传数据的服务器字段
    ///   - data: 要上传的二进制数据
    ///   - completion: 完成回调
    func upload(URLString:String,parameters:[String:AnyObject]?,name:String,data:Data,completion:@escaping (_ json:AnyObject?,_ isSuccess:Bool)->()) {
       /*post(URLString, parameters: parameters, constructingBodyWith: { (formData) in
        //FIXmE
         }, progress: nil, success: {(_, json) in
            
            completion(json, true)
            
             }) { (task, error) in
                
                
        }*/
    }
    
    //封装AFN的GET/POST 请求
    /*
     parameter method : GET/POST
     parameter URLString:URLString
     parameter :parameters 参数字典
     parameter completion:完成回调[json(字典/数组)是否成功]
 */
    func request(method:WBHTTPMethod = .GET, URLString:String,parameters:[String:AnyObject]?,completion:@escaping (_ json:AnyObject?,_ isSuccess:Bool)->()){
        
        let suucess = {(task:URLSessionDataTask,json:Any?)->() in
            completion(json as AnyObject, true)
        }
        let failure = { (task:URLSessionDataTask?,error:Error)->() in
            if (task?.response as? HTTPURLResponse)? .statusCode == 403 {
                print("token过期")
                //发送通知 谁接受通知谁处理 提示用户再次登录
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: "bad token")
            }
            completion(nil, false)
        }
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: suucess, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: suucess, failure: failure)
        }
    }

}









